package LogicaClasesNew;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.criteria.CriteriaQuery;

public class ControladorCategoria implements IcontroladorCategoria {

 //private EntityManagerFactory emf;
private IcontroladorProducto ICPROD;    
    
 public ControladorCategoria() {
    }

//Nos trae el factory en su instancia actual, luego hace un get de persistencia y crea un entity y devuelve eso.
 public EntityManager getEntityManager() {
        Fabrica factory = Fabrica.getInstance(); 
        return factory.getEmf().createEntityManager();
    }

 
public void createCategoria(String NombreCat, boolean TieneProd) {
        
        Categoria cat = new Categoria(NombreCat,TieneProd);
    
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(cat);
            em.getTransaction().commit();
        } 
        catch (Exception t){
        //CAPTURA el error... y...
         StackTraceElement[] trace = new StackTraceElement[] {
         new StackTraceElement("ClassName","methodName","fileName",5)
        };
            
         //... y ... lo devuelve para que el swing lo capte en una ventanita pechocha!
            t.setStackTrace(trace);
            throw t;
            
        }
    }

public void createCategoriacpadre(String NombreCat,String Nompadre, boolean TieneProd){
        Categoria padre = findCategoria(Nompadre);
        Categoria cat = new Categoria(NombreCat,TieneProd);
        cat.setPadre(padre);
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            em.persist(cat);
            em.getTransaction().commit();
        } 
        catch (Exception t){
        //CAPTURA el error... y...
         StackTraceElement[] trace = new StackTraceElement[] {
         new StackTraceElement("ClassName","methodName","fileName",5)
        };
            
         //... y ... lo devuelve para que el swing lo capte en una ventanita pechocha!
            t.setStackTrace(trace);
            throw t;
            
        }
    }

//ESTA SERA LA PRIVADA
private void edit(Categoria nomCategoria){
//        Categoria categoria = findCategoria(nomCategoria);
        
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            nomCategoria = em.merge(nomCategoria);
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                String Nombre = nomCategoria.getNombre();
                if (findCategoria(Nombre) == null) {
                  //  throw new NonexistentEntityException("The categoria with id " + nomCategoria + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

//ESTA SERA LA PUBLICA    
public void editCategoria(String nombreCate){
    
            
    }
    
    /*
    public void destroy(String Nombre) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Categoria categoria;
            try {
                categoria = em.getReference(Categoria.class, Nombre);
                categoria.getNombre();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The categoria with id " + Nombre + " no longer exists.", enfe);
            }
            em.remove(categoria);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }*/
    
public Categoria findCategoria(String Nombre) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Categoria.class, Nombre);
        } finally {
            em.close();
        }
    }
    
public List<Categoria> findCategoriaEntities() {
        return findCategoriaEntities(true, -1, -1);
    }

public List<Categoria> findCategoriaEntities(int maxResults, int firstResult) {
        return findCategoriaEntities(false, maxResults, firstResult);
    }

private List<Categoria> findCategoriaEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Categoria.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }/*
        public int getCategoriaCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Categoria> rt = cq.from(Categoria.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }*/
private IcontroladorProducto getInstanciaforICPROD(){
        Fabrica fab = Fabrica.getInstance();
        this.ICPROD = fab.getControladorProducto();
        return ICPROD;
     }
      
      
public void addProductoCategoria(String Nombre, int numRefProd){
          getInstanciaforICPROD();
          
          Categoria cate = findCategoria(Nombre);
          
          Producto prod = ICPROD.findProducto(numRefProd);
          
          
          cate.addProducto(prod);
          
          
          //YA PERSISTO EL ADD DEL PRODUCTO A DICHA CATEGORIA
          edit(cate);
      }
      
      
public void RemoveProductoCategoria(String name, int numRefprod){
          getInstanciaforICPROD();
          
          Categoria cate = findCategoria(name);
          
          Producto prod = ICPROD.findProducto(numRefprod);
          
          cate.removeProducto(prod);
          
          //YA PERSISTO EL ADD DEL PRODUCTO A DICHA CATEGORIA
          edit(cate);
      }
      
      
public boolean getTieneProd(String nombre){
          Categoria cat = findCategoria(nombre);
          return cat.getTieneProductos();
      
      }

public List<Producto> getListadoProductosXcategoria(String nomCat){
    Categoria cat = findCategoria(nomCat);
    
    return cat.getListadoProducto();
}

public List<Categoria> getListadoCategoriaXcategoria(String nomCat){
    Categoria cat = findCategoria(nomCat);
    
    return cat.getListadoCategoria();
}


public void addCatHijaToCatPadre(String catPadre, String catHija){
          Categoria CatPadre = findCategoria(catPadre);
          
          CatPadre.addCategoria(findCategoria(catHija));
          
          //YA PERSISTO EL ADD DEL PRODUCTO A DICHA CATEGORIA
          edit(CatPadre);
      }

}